/**
 * @author		FengChaoHua
 * @create		2018年4月29日 下午5:11:05
 * @project	huilun_wx
 * @desc		
 */
package top.wardyan.base.service;

import java.util.List;

import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;

/**
 * @author FengChaoHua
 *
 */
public interface IService<T extends Model<T>> {
	
	
	/**
	 * 保存新对象
	 * 注意，如果需要拒绝保存某字段重复的新对象，则需要重写
	 * @param object
	 * @return
	 */
	public Boolean save(T object);
	
	/**
	 * 更新对象
	 * @param object
	 * @return
	 */
	public Boolean update(T object);
	
	/**
	 * 删除对象
	 * @param object
	 * @return
	 */
	public Boolean delete(T object);
	
	/**
	 * 根据给定的sID来查询对象，如果没有找到，或者对象没有ID这个属性，则返回null。如果匹配多个，则只返回第一个。
	 * @param sid
	 * @return
	 */
	public T findByID(Integer id);
	
	/**
	 * 根据给定的sql语句查询对象。如果没有找到，则返回null。如果匹配多个，则只返回第一个。
	 * @param sql
	 * @return
	 */
	public T findBySql(String sql, Object... params);
	
	/**
	 * 列表显示对象，使用默认的sql语句。
	 * @return
	 */
	public List<T> list();
	
	/**
	 * 列表显示对象，使用默认的sql语句
	 * @param page	当前页号
	 * @param pageSize 每页记录数
	 * @return
	 */
	public Page<T> list(Integer page, Integer pageSize);
	

	/**
	 * 
	 * @param sql 
	 * @param page
	 * @param pageSize
	 * @param orderBy 如果不为null,则会作为最外层的order by *
	 * @param params
	 * @return
	 */
	public Page<T> list(String sql, Integer page, Integer pageSize, String orderBy, Object... params);
	
	/**
	 * 列表显示对象。这里不适用分页
	 * @param sql
	 * @param params 可变参数。如果sql语句中使用了占位符，则从这里读取参数。
	 * @return
	 */
	public List<T> List(String sql, Object... params);
	
	/**
	 * 统计对象数量，使用默认的sql语句，全部对象
	 * @return
	 */
	public Integer count();
	
	/**
	 * 统计对象数量
	 * @param sql
	 * @param params 可变参数。如果sql语句中使用了占位符，则从这里读取参数。
	 * @return
	 */
	public Integer count(String sql, Object... params);
	
}
